home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-09-21 | 8.1 KB | 279 lines | [TEXT/ttxt] |
- // source container: movie-view.dylan
-
- define class <movie-view> (<view>)
- slot movie :: <Movie>,
- init-value: as(<Movie>, 0),
- init-keyword: movie:;
- slot show-mc?,
- init-value: #t,
- init-keyword: show-mc?:;
- slot enable-editing?,
- init-value: #t,
- init-keyword: enable-editing?:;
-
- slot is-playing?,
- init-value: #f;
- slot loop?,
- init-value: #f;
- slot mc :: <MovieController>,
- init-value: as(<MovieController>, 0);
- end class;
-
- // called as each instance of <movie-view> is instantiated
- define method initialize (view :: <movie-view>, #key)
- next-method();
-
- unless (nil?(view.movie))
- set-movie-to-view(view, view.movie);
- end unless;
-
- end method;
-
- // when a movie is closed, we need to clean up the relevant structures
- define method dispose (view :: <movie-view>)
-
- stop-playing(view);
-
- unless (nil?(view.movie))
- unless(nil?(view.mc))
- *controller-list* := remove!(*controller-list*,view.mc);
- DisposeMovieController(as(<ComponentInstance>,view.mc));
- view.mc := as(<MovieController>, 0);
- end unless;
- DisposeMovie(view.movie);
- view.movie := as(<Movie>, 0);
- end unless;
-
- next-method();
- end method;
-
- // this informs the movie about the size of the window it will play inside
- // of on screen and intializes the GWorld of the movie to be the current one
- define method size-setter (view :: <movie-view>, new-size :: <point>)
- next-method();
-
- unless (nil?(view.movie))
- with-stack-structure(r(<qd-rect>),
- begin
- focus(view);
- // Set the movie to play in our view
- set-rect(r, view.local-bounds);
- SetMovieBox(view.movie, r);
- SetMovieGWorld(view.movie, as(<CGrafPort>, 0),
- as(<GDHandle>,0));
-
- end);
- end unless;
- end method;
-
- define method start-playing (view :: <movie-view>)
- unless (nil?(view.movie))
- if (view.is-playing?)
- stop-playing(view);
- end if;
-
- GoToBeginningOfMovie(view.movie);
-
- // Start the movie playing
- StartMovie(view.movie);
-
- // Mark that we are playing
- view.is-playing? := #t;
- end unless;
- end method;
-
- define method stop-playing (view :: <movie-view>)
- unless (nil?(view.movie) | ~ view.is-playing?)
- StopMovie(view.movie);
- view.is-playing? := #f;
- end unless;
- end method;
-
- // this is called in response to an update event (the engine that calls it is
- // embedded within the Framework
- define method draw (view :: <movie-view>,
- draw-rect :: <rect>)
- ignore(draw-rect);
-
- unless (nil?(view.movie))
- SetMovieActive(view.movie, #t);
- UpdateMovie(view.movie);
- MoviesTask(view.movie, $doTheRightThing);
- end unless;
-
- unless (~view.show-mc? | nil?(view.mc))
- MCDraw(view.mc, get-window(view).window-ptr);
- end unless;
-
- end method;
-
- //sets up a view onto the movie in the window that is to contain the movie
- define method set-movie-to-view (view :: <movie-view>,
- new-movie :: <Movie>)
-
- unless (new-movie = view.movie)
- unless (nil?(view.movie))
- unless(nil?(view.mc))
- DisposeMovieController(view.mc);
- end unless;
- DisposeMovie(view.movie);
- end unless;
-
- view.movie := new-movie;
-
- with-stack-structure(view-rect(<qd-rect>),
- begin
- set-rect(view-rect, view.local-bounds);
-
- let movie-window = get-window(view);
- let movie-port = as(<CGrafPort>, movie-window.window-
- ptr);
-
- SetMovieGWorld(view.movie, movie-port,
- as(<GDHandle>,0));
- SetMovieBox(view.movie, view-rect);
-
- if (view.show-mc?)
- view.mc :=
- as(<MovieController>,
- NewMovieController(view.movie, view-rect,
- $mcTopLeftMovie));
- unless (nil?(view.mc))
- MCSetControllerBoundsRect(view.mc, view-rect);
- MCSetControllerPort(view.mc, movie-port);
- draw(view, view.local-bounds);
- *controller-list* := add!(*controller-list*, view.mc);
- if (view.enable-editing?)
- MCEnableEditing(view.mc, #t);
- end if;
- end unless;
- end if;
- end);
- end unless;
- end method;
-
- // called while waiting for the events to occur (during idle time)
- define method do-idle (view :: <movie-view>)
-
- if (view.mc & view.show-mc)
- // hack to have null events sent to the event loop during idle time
- // next version of the Framework will take care of this
-
- with-stack-structure(event-record(<EventRecord>),
- begin
- event-record.EventRecord$what := 0;
- GetMouse(event-record.EventRecord$where);
- event-record.EventRecord$when := TickCount();
- event-record.EventRecord$message := 0;
- event-record.EventRecord$modifiers := #x80;
- MCIsPlayerEvent(view.mc, event-record);
- end);
- else
-
- if (view.is-playing?)
- MoviesTask(view.movie, $doTheRightThing);
- if (IsMovieDone(view.movie))
- stop-playing(view);
- end if;
-
- end if;
- end if;
- end method;
-
- // The following methods are menu callbacks that suport editing
- //functionality of the movie
- // controller
-
- define method do-event (view :: <movie-view>,
- event :: <menu-event>,
- id == #"clear")
-
- ignore(event, id);
- unless(nil?(view.mc))
- MCClear(view.mc);
- end unless;
- end method;
-
- define method do-event (view :: <movie-view>,
- event :: <menu-event>,
- id == #"undo")
-
- ignore(event, id);
- unless(nil?(view.mc))
- MCUndo(view.mc);
- end unless;
- end method;
-
- define method do-event (view :: <movie-view>,
- event :: <menu-event>,
- id == #"copy")
-
- ignore(event, id);
- unless(nil?(view.mc))
- let selection = MCCopy(view.mc);
- unless(nil?(selection))
- PutMovieOnScrap(selection, $movieScrapOnlyPutMovie);
- DisposeMovie(selection);
- end unless;
- end unless;
- end method;
-
-
- define method do-event (view :: <movie-view>,
- event :: <menu-event>,
- id == #"cut")
-
- ignore(event, id);
- unless(nil?(view.mc))
- let selection = MCCut(view.mc);
- unless(nil?(selection))
- PutMovieOnScrap(selection, $movieScrapOnlyPutMovie);
- DisposeMovie(selection);
- end unless;
- end unless;
- end method;
-
- define method do-event (view :: <movie-view>,
- event :: <menu-event>,
- id == #"paste")
-
- ignore(event, id);
- unless(nil?(view.mc) | ~IsScrapMovie(as(<Track>,0)))
- MCPaste(view.mc, as(<Movie>,0));
- end unless;
- end method;
-
- // this method highlights the menus correctly
- define method do-setup-menus (view :: <movie-view>)
- next-method();
-
- unless(nil?(view.mc) | ~view.enable-editing? | ~view.show-mc |
- nil?(view.movie))
- enable-item(#"copy");
- MCSetUpEditMenu(view.mc, $doTheRightThing, as(<MenuHandle>,*edit-
- menu*.toolbox-menu));
- end unless;
-
- end method;
-
- define method do-event (view :: <movie-view>,
- event :: <generic-mouse-down-event>,
- id :: <keyword>)
- // when controller not present:
- // double-click to play, single-click to stop
-
- ignore(id);
- if (~view.show-mc | nil?(view.mc))
- if (double-click? (event))
- if (IsMovieDone(view.movie))
- GoToBeginningOfMovie(view.movie);
- end if;
- start-playing(view);
- else
- stop-playing(view);
- next-method();
- end if;
- else
- next-method();
- end if;
- end method;